
/**
    Rc指针
       -可以拥有所有权
       用途：
            1.解决所有权move的问题    
            2.strong_count
            3.用于共享所有权，确保数据在所有使用者完成后释放
            4.需要多个所有者共享同一份不可变数据
 */
use std::rc::Rc;
#[derive(Debug)]
struct User {
    
}
fn main() {
    let xiao_ming = User{};
    let zhang_san = User{};
    let li_si = User{};
    
    //这里zhang_san所有权已经赋值给了use_vec 所以ues_vec2拿不到
    // let use_vec = vec![xiao_ming, zhang_san];
    // let ues_vec2 = vec![zhang_san, li_si];
    
    //这里没有问题是因为 i32 是简单类型 是被存入栈上的 可以被clone赋值
    // let a:i32 = 1;
    // let b:i32 = 2;
    // let c:i32 = 3;
    // let num_vec = vec![a, b];
    // let num_vec2 = vec![b, c];


    let rc_xiao_ming = Rc::new(User{});
    let rc_zhang_san = Rc::new(User{});
    let rc_li_si =Rc::new(User{});

    //这里也不行  是因为这种形式第二次使用 rc_zhang_san 时它的引用计数并没有+1  需要使用Rc::clone(use) 来增加引用计数
    // let rc_use_vec = vec![rc_xiao_ming, rc_zhang_san];
    // let rc_use_vec2 = vec![ rc_zhang_san, rc_li_si];

    //运行通过
    let rc_use_vec = vec![rc_xiao_ming, Rc::clone(&rc_zhang_san)];
    let rc_use_vec2 = vec![ Rc::clone(&rc_zhang_san), rc_li_si];
    
    //strong_count  指向该对象的引用数  初始化一次  后续使用clone后增加一次
    println!("vec1:{:?}--vec2:{:?}", rc_use_vec,rc_use_vec2);
    println!("strong_count:{}", Rc::strong_count(&rc_zhang_san));
    
    //手动释放rc_use_vec2 并回收所有权
    std::mem::drop(rc_use_vec2);
    println!("strong_count:{}", Rc::strong_count(&rc_zhang_san));
}
